package cn.arnold.juc;

/**
 * @Author Arnold
 * @Desc 死锁
 * 产生死锁的4个必要条件：
 * 1.互斥条件：进程要求对所分配的资源进行排它性控制，即在一段时间内某资源仅为一进程所占用。
 * 2.请求和保持条件：当进程因请求资源而阻塞时，对已获得的资源保持不放。
 * 3.不剥夺条件：进程已获得的资源在未使用完之前，不能剥夺，只能在使用完时由自己释放。
 * 4.环路等待条件：在发生死锁时，必然存在一个进程--资源的环形链。
 **/
public class Deadlock {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";
        MyResource A = new MyResource(lockA, lockB);
        MyResource B = new MyResource(lockB, lockA);
        new Thread(A, "t1").start();
        new Thread(B, "t2").start();
    }

}

class MyResource implements Runnable {
    String first;
    String second;

    public MyResource(String first, String second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public void run() {
        synchronized (first) {
            System.out.println(Thread.currentThread().getName() + "获得：" + first);
            try {
                Thread.sleep(2000);
                synchronized (second) {
                    System.out.println(Thread.currentThread().getName() + "获得：" + second);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}